package com.idea.plugin.core.domain.info;

import com.idea.plugin.core.domain.model.JavaClassModel;
import com.idea.plugin.core.logging.Log;
import com.idea.plugin.core.logging.NoticeLog;
import com.intellij.psi.PsiClass;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 在方法中，作为参数传递给后面的类进行记录传值的类
 *
 * @author chenhx
 * @version JavaClassInfo.java, v 0.1 2019-07-04 15:42 chenhx
 */
@Data
public class JavaClassInfo {

    private static Log log = new NoticeLog();

    /**
     * 基础目录
     */
    private String baseDir;

    /**
     * 当前被测试类的包名
     */
    private String packageName;
    /**
     * 被测试类的绝对路径
     */
    private String absolutePath;
    /**
     * 被测试类的绝对路径
     */
    private String testAbsolutePath;
    /**
     * 被测试类的全限定名称
     */
    private String qualifiedName;
    /**
     * 被测试类的类名
     */
    private String name;
    /**
     * 当前 类属性名称
     * 被测试的类名 - 首字母小写
     */
    private String nameLowerCamel;

    private PsiClass psiClass;

    /**
     * 类信息存储
     * key - 类的全限定名称
     * value - 类信息
     */
    private Map<String, JavaClassModel> javaClassModelMap = new HashMap<>();

    /**
     * key - 属性变量名称
     * value - 属性类型的全限定名称
     */
    private Map<String, String> fieldFullyTypeNameMap = new HashMap<>();

    /**
     * key - 类型简称
     * value - 类型的全限定名称
     */
    private Map<String, String> fullyTypeNameMap = new HashMap<>();

    /**
     * mock的类信息
     * key - 属性变量名称 + "." + 方法名称（暂时不支持重名方法）
     * value - 属性类型的全限定名称
     */
    private Map<String, String> mockFullyTypeNameMap = new HashMap<>();

    /**
     * 需要导入的包  如果有多个，全部使用全限定名，在该map中的，表示没有简称相同的类
     * key - 变量名-简称
     * value - 全限定名称
     */
    private Map<String, Set<String>> importJavaPackageMap = new HashMap<>();

    /**
     * 测试方法名称出现的次数，如果有多个重名方法，方法后面接上数字
     */
    private Map<String, Integer> methodMap = new HashMap<>();


    public String getName() {
        return name;
    }

    /**
     * Getter method for property <tt>packageName</tt>.
     *
     * @return property value of packageName
     */
    public String getPackageName() {
        return packageName;
    }

    /**
     * Getter method for property <tt>absolutePath</tt>.
     *
     * @return property value of absolutePath
     */
    public String getAbsolutePath() {
        return absolutePath;
    }

    /**
     * Setter method for property <tt>absolutePath</tt>.
     *
     * @param absolutePath value to be assigned to property absolutePath
     */
    public void setAbsolutePath(String absolutePath) {
        this.absolutePath = absolutePath;
    }

    private void setTypeNameByAbsolutePath(String absolutePath, String letter) {
        setName(absolutePath.substring(absolutePath.lastIndexOf(letter) + 1, absolutePath.lastIndexOf(".")));
    }

    /**
     * Getter method for property <tt>testAbsolutePath</tt>.
     *
     * @return property value of testAbsolutePath
     */
    public String getTestAbsolutePath() {
        return testAbsolutePath;
    }

    /**
     * Getter method for property <tt>fullyTypeName</tt>.
     *
     * @return property value of fullyTypeName
     */
    public String getQualifiedName() {
        return qualifiedName;
    }

    /**
     * Setter method for property <tt>fullyTypeName</tt>.
     *
     * @param qualifiedName value to be assigned to property fullyTypeName
     */
    public void setQualifiedName(String qualifiedName) {
        this.qualifiedName = qualifiedName;
    }
}
